// 如何实现 柯里化的通用函数
/*
柯里化就是一个参数收集器，当收集到的参数个数达到原函数(核心函数)的参数个数时，会执行原函数
*/
function curring(fn, arr = []) {
  let len = fn.length; // 获取当前函数的参数的个数，它和arguments不同，arguments是实际接收的，而它是期望接收的、可以接受的最大参数个数
  console.log('len:',len);
  return function(...args) {
    // [1,2]
    arr = [...arr, ...args];
    if (arr.length < len) {
      return curring(fn, arr); // 递归 如果数量不够 不停的返回 函数，继续接受参数
    } else {
      return fn(...arr);
    }
  };
}

function add(a, b, c, d, e) {
  return a + b + c + d + e;
}
//↑柯里化,偏函数↓ curring函数能将一个函数柯里化
let r = curring(add)(1, 2)(3)(4, 5, 6);
console.log(r);

/*function checkType(type,value){
    // call 改变了this指向
     return Object.prototype.toString.call(value) === `[object ${type}]`
}
let util = {};
let types = ['String','Number','Boolean','Null','Undefined'] //TODO ← 这里就是柯里化的好处之一(和原本的实现进行对比(type.js)) 再不用我们自己手动传这些了
types.forEach(type=>{
    util[`is${type}`] = curring(checkType)(type)
});
console.log(util.isString('hello'))*/

// 1) 反柯里化 是让函数的方法 变得更通用一些 反柯里化的实现
// Object.prototype.toString.call(value)
// toString('hello');

